package com.example.aspect;

import com.example.common.CommonRes;
import com.example.validation.DtoValidator;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RequestBody;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

/**
 * 功能描述
 * 校验controller中RequestBody注解的参数
 * @author: jimmy
 * @date: 2024年01月13日 22:28
 */
//@Configuration
@Aspect
public class ValidateAspect {
    /**
     * 校验器
     */
    @Autowired
    private DtoValidator dtoValidator;

    /**
     * 找到controller中add开头的方法
     */
    @Pointcut("execution(* com.example.controller.*Controller.add*(..))")
    public void addMethods() {}

    /**
     * 找到controller中modify开头的方法
     */
    @Pointcut("execution(* com.example.controller.*Controller.modify*(..))")
    public void modifyMethods() {}


    /**
     * 环绕aop，校验RequestBody注解的参数
     * @param joinPoint
     * @return
     * @throws Throwable
     */
    @Around("addMethods() || modifyMethods()")
    public Object processLog(ProceedingJoinPoint joinPoint)throws Throwable {
        //方法
        Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
        //所有参数
        Parameter[] parameters = method.getParameters();
        //RequestBody注解的参数的值
        Object requestBody=null;
        //是否找到相关参数
        boolean find=false;
        //获取参数
        Object[] args = joinPoint.getArgs();
        //参数值数组下标
        int n=0;
        for (Parameter parameter : parameters) {
            find=false;
            Annotation[] annotations = parameter.getAnnotations();
            for (Annotation annotation : annotations) {
                //找到RequestBody注解的参数的值
                if (annotation.annotationType() == RequestBody.class) {
                    // 处理带有特定注解的参数
                    requestBody=args[n];
                    find=true;
                    break;
                }
            }
            if(find){
                break;
            }
            n++;
        }
        //找到RequestBody注解的参数的值,校验参数
        if(requestBody!=null){
            CommonRes result= dtoValidator.validate(requestBody);
            //不为空则校验没有通过，直接返回
            if(result!=null){
                return  result;
            }
        }
        //参数名称
//        LocalVariableTableParameterNameDiscoverer u =
//                new LocalVariableTableParameterNameDiscoverer();
//        String[] name=u.getParameterNames(method);
//        System.out.println("---------------------");
//        System.out.println(name[0]);
//        System.out.println("---------------------");
        return joinPoint.proceed();
    }
}
